package com.sxj.corejava.code20_动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class LogInvocationHandler implements InvocationHandler {

    // 目标对象
    private Object target;

    public LogInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     * 代理方法的具体实现,该方法适用于所有被代理的接口方法
     * @param proxy  目标方法所在的代理对象,基本没用
     * @param method 目标方法
     * @param args   目标方法的参数列表
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 执行目标方法之前
        System.out.println("在" + new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date()) + "执行了" + method.getName() + "方法,方法的参数为:" + Arrays.toString(args));
        // 执行目标方法
        // 参数一:目标对象
        // 参数二:方法参数
        Object result = method.invoke(target, args);
        // 执行目标方法之后
        System.out.println(method.getName() + "方法执行结束,方法的返回值为:" + result);
        return result;
    }
}
